home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / macos / uae069b2.src.cpt.hqx / UAE069ß2.SRC.CPT / uae069fl2.src / blitfunc.c < prev    next >
C/C++ Source or Header  |  1997-06-25  |  99KB  |  2,830 lines

  1. #include "sysconfig.h"
  2. #include "sysdeps.h"
  3. #include "config.h"
  4. #include "options.h"
  5. #include "custom.h"
  6. #include "my_memory.h"
  7. #include "blitter.h"
  8. #include "blitfunc.h"
  9.  
  10. void blitdofast_0(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  11. {
  12. int i,j;
  13. uae_u32 totald = 0;
  14. if (currprefs.blits_32bit_enabled && b->hblitsize > 1) {
  15. uae_u32 dest;
  16. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  17. for (j=0;j<b->vblitsize;j++) {
  18.     for(i=0;i<count;i++) {
  19.         dest = 0;
  20.         totald |= dest;
  21.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  22.     }
  23.     if (oddword) {
  24.         dest = 0;
  25.         totald |= dest;
  26.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  27.     }
  28.     if (ptd) ptd += b->bltdmod;
  29. }
  30. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  31. } else {
  32. uae_u32 dstd=0;
  33. uae_u16 foo, *dstp = &foo;
  34. for (j = 0; j < b->vblitsize; j++) {
  35.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  36.  
  37.         do_put_mem_word (dstp, dstd);
  38.         dstd = (0) & 0xFFFF;
  39.         totald |= dstd;
  40.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  41.     }
  42.     if (ptd) ptd += b->bltdmod;
  43. }
  44.         do_put_mem_word (dstp, dstd);
  45. }
  46. if (totald == 0) b->blitzero = 1;
  47. }
  48. void blitdofast_desc_0(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  49. {
  50. uae_u32 totald = 0;
  51. int i,j;
  52. if (currprefs.blits_32bit_enabled && b->hblitsize > 1) {
  53. uae_u32 dest;
  54. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  55. for (j=0;j<b->vblitsize;j++) {
  56.     for(i=0;i<count;i++) {
  57.         dest = 0;
  58.         totald |= dest;
  59.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  60.     }
  61.     if (oddword) {
  62.         dest = 0;
  63.         totald |= dest;
  64.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  65.     }
  66.     if (ptd) ptd-=b->bltdmod;
  67. }
  68. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  69. } else {
  70. uae_u32 dstd=0;
  71. uae_u16 foo, *dstp = &foo;
  72. for (j = 0; j < b->vblitsize; j++) {
  73.     for (i = 0; i < b->hblitsize; i++) {
  74.         uae_u32 bltadat, srca;
  75.         do_put_mem_word (dstp, dstd);
  76.         dstd = (0) & 0xFFFF;
  77.         totald |= dstd;
  78.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  79.     }
  80.     if (ptd) ptd -= b->bltdmod;
  81. }
  82.         do_put_mem_word (dstp, dstd);
  83. }
  84. if (totald == 0) b->blitzero = 1;
  85. }
  86. void blitdofast_a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  87. {
  88. int i,j;
  89. uae_u32 totald = 0;
  90. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  91. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  92. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  93. uae_u32 dest;
  94. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  95. for (j=0;j<b->vblitsize;j++) {
  96.     for(i=0;i<count;i++) {
  97.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  98.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  99.         dest = (srcc & ~srca);
  100.         totald |= dest;
  101.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  102.     }
  103.     if (oddword) {
  104.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  105.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  106.         dest = (srcc & ~srca);
  107.         totald |= dest;
  108.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  109.     }
  110.     if (pta) pta += b->bltamod;
  111.     if (ptc) ptc += b->bltcmod;
  112.     if (ptd) ptd += b->bltdmod;
  113. }
  114. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  115. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  116. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  117. } else {
  118. uae_u32 preva = 0;
  119. uae_u32 srcc = b->bltcdat;
  120. uae_u32 dstd=0;
  121. uae_u16 foo, *dstp = &foo;
  122. for (j = 0; j < b->vblitsize; j++) {
  123.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  124.  
  125.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  126.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  127.         bltadat &= blit_masktable[i];
  128.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  129.         preva = bltadat;
  130.         do_put_mem_word (dstp, dstd);
  131.         dstd = ((srcc & ~srca)) & 0xFFFF;
  132.         totald |= dstd;
  133.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  134.     }
  135.     if (pta) pta += b->bltamod;
  136.     if (ptc) ptc += b->bltcmod;
  137.     if (ptd) ptd += b->bltdmod;
  138. }
  139. b->bltcdat = srcc;
  140.         do_put_mem_word (dstp, dstd);
  141. }
  142. if (totald == 0) b->blitzero = 1;
  143. }
  144. void blitdofast_desc_a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  145. {
  146. uae_u32 totald = 0;
  147. int i,j;
  148. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  149. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  150. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  151. uae_u32 dest;
  152. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  153. for (j=0;j<b->vblitsize;j++) {
  154.     for(i=0;i<count;i++) {
  155.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  156.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  157.         dest = (srcc & ~srca);
  158.         totald |= dest;
  159.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  160.     }
  161.     if (oddword) {
  162.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  163.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  164.         dest = (srcc & ~srca);
  165.         totald |= dest;
  166.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  167.     }
  168.     if (pta) pta -= b->bltamod;
  169.     if (ptc) ptc -= b->bltcmod;
  170.     if (ptd) ptd-=b->bltdmod;
  171. }
  172. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  173. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  174. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  175. } else {
  176. uae_u32 preva = 0;
  177. uae_u32 srcc = b->bltcdat;
  178. uae_u32 dstd=0;
  179. uae_u16 foo, *dstp = &foo;
  180. for (j = 0; j < b->vblitsize; j++) {
  181.     for (i = 0; i < b->hblitsize; i++) {
  182.         uae_u32 bltadat, srca;
  183.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  184.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  185.         bltadat &= blit_masktable[i];
  186.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  187.         preva = bltadat;
  188.         do_put_mem_word (dstp, dstd);
  189.         dstd = ((srcc & ~srca)) & 0xFFFF;
  190.         totald |= dstd;
  191.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  192.     }
  193.     if (pta) pta -= b->bltamod;
  194.     if (ptc) ptc -= b->bltcmod;
  195.     if (ptd) ptd -= b->bltdmod;
  196. }
  197. b->bltcdat = srcc;
  198.         do_put_mem_word (dstp, dstd);
  199. }
  200. if (totald == 0) b->blitzero = 1;
  201. }
  202. void blitdofast_2a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  203. {
  204. int i,j;
  205. uae_u32 totald = 0;
  206. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  207. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  208. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  209. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  210. uae_u32 dest;
  211. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  212. for (j=0;j<b->vblitsize;j++) {
  213.     for(i=0;i<count;i++) {
  214.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  215.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  216.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  217.         dest = (srcc & ~(srcb & srca));
  218.         totald |= dest;
  219.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  220.     }
  221.     if (oddword) {
  222.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  223.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  224.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  225.         dest = (srcc & ~(srcb & srca));
  226.         totald |= dest;
  227.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  228.     }
  229.     if (pta) pta += b->bltamod;
  230.     if (ptb) ptb += b->bltbmod;
  231.     if (ptc) ptc += b->bltcmod;
  232.     if (ptd) ptd += b->bltdmod;
  233. }
  234. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  235. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  236. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  237. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  238. } else {
  239. uae_u32 preva = 0;
  240. uae_u32 prevb = 0, srcb = b->bltbhold;
  241. uae_u32 srcc = b->bltcdat;
  242. uae_u32 dstd=0;
  243. uae_u16 foo, *dstp = &foo;
  244. for (j = 0; j < b->vblitsize; j++) {
  245.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  246.  
  247.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  248.         if (ptb) {
  249.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  250.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  251.             prevb = bltbdat;
  252.         }
  253.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  254.         bltadat &= blit_masktable[i];
  255.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  256.         preva = bltadat;
  257.         do_put_mem_word (dstp, dstd);
  258.         dstd = ((srcc & ~(srcb & srca))) & 0xFFFF;
  259.         totald |= dstd;
  260.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  261.     }
  262.     if (pta) pta += b->bltamod;
  263.     if (ptb) ptb += b->bltbmod;
  264.     if (ptc) ptc += b->bltcmod;
  265.     if (ptd) ptd += b->bltdmod;
  266. }
  267. b->bltbhold = srcb;
  268. b->bltcdat = srcc;
  269.         do_put_mem_word (dstp, dstd);
  270. }
  271. if (totald == 0) b->blitzero = 1;
  272. }
  273. void blitdofast_desc_2a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  274. {
  275. uae_u32 totald = 0;
  276. int i,j;
  277. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  278. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  279. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  280. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  281. uae_u32 dest;
  282. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  283. for (j=0;j<b->vblitsize;j++) {
  284.     for(i=0;i<count;i++) {
  285.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  286.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  287.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  288.         dest = (srcc & ~(srcb & srca));
  289.         totald |= dest;
  290.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  291.     }
  292.     if (oddword) {
  293.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  294.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  295.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  296.         dest = (srcc & ~(srcb & srca));
  297.         totald |= dest;
  298.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  299.     }
  300.     if (pta) pta -= b->bltamod;
  301.     if (ptb) ptb -= b->bltbmod;
  302.     if (ptc) ptc -= b->bltcmod;
  303.     if (ptd) ptd-=b->bltdmod;
  304. }
  305. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  306. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  307. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  308. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  309. } else {
  310. uae_u32 preva = 0;
  311. uae_u32 prevb = 0, srcb = b->bltbhold;
  312. uae_u32 srcc = b->bltcdat;
  313. uae_u32 dstd=0;
  314. uae_u16 foo, *dstp = &foo;
  315. for (j = 0; j < b->vblitsize; j++) {
  316.     for (i = 0; i < b->hblitsize; i++) {
  317.         uae_u32 bltadat, srca;
  318.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  319.         if (ptb) {
  320.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  321.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  322.             prevb = bltbdat;
  323.         }
  324.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  325.         bltadat &= blit_masktable[i];
  326.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  327.         preva = bltadat;
  328.         do_put_mem_word (dstp, dstd);
  329.         dstd = ((srcc & ~(srcb & srca))) & 0xFFFF;
  330.         totald |= dstd;
  331.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  332.     }
  333.     if (pta) pta -= b->bltamod;
  334.     if (ptb) ptb -= b->bltbmod;
  335.     if (ptc) ptc -= b->bltcmod;
  336.     if (ptd) ptd -= b->bltdmod;
  337. }
  338. b->bltbhold = srcb;
  339. b->bltcdat = srcc;
  340.         do_put_mem_word (dstp, dstd);
  341. }
  342. if (totald == 0) b->blitzero = 1;
  343. }
  344. void blitdofast_30(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  345. {
  346. int i,j;
  347. uae_u32 totald = 0;
  348. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  349. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  350. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  351. uae_u32 dest;
  352. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  353. for (j=0;j<b->vblitsize;j++) {
  354.     for(i=0;i<count;i++) {
  355.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  356.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  357.         dest = (~srcb & srca);
  358.         totald |= dest;
  359.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  360.     }
  361.     if (oddword) {
  362.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  363.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  364.         dest = (~srcb & srca);
  365.         totald |= dest;
  366.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  367.     }
  368.     if (pta) pta += b->bltamod;
  369.     if (ptb) ptb += b->bltbmod;
  370.     if (ptd) ptd += b->bltdmod;
  371. }
  372. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  373. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  374. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  375. } else {
  376. uae_u32 preva = 0;
  377. uae_u32 prevb = 0, srcb = b->bltbhold;
  378. uae_u32 dstd=0;
  379. uae_u16 foo, *dstp = &foo;
  380. for (j = 0; j < b->vblitsize; j++) {
  381.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  382.  
  383.         if (ptb) {
  384.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  385.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  386.             prevb = bltbdat;
  387.         }
  388.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  389.         bltadat &= blit_masktable[i];
  390.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  391.         preva = bltadat;
  392.         do_put_mem_word (dstp, dstd);
  393.         dstd = ((~srcb & srca)) & 0xFFFF;
  394.         totald |= dstd;
  395.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  396.     }
  397.     if (pta) pta += b->bltamod;
  398.     if (ptb) ptb += b->bltbmod;
  399.     if (ptd) ptd += b->bltdmod;
  400. }
  401. b->bltbhold = srcb;
  402.         do_put_mem_word (dstp, dstd);
  403. }
  404. if (totald == 0) b->blitzero = 1;
  405. }
  406. void blitdofast_desc_30(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  407. {
  408. uae_u32 totald = 0;
  409. int i,j;
  410. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  411. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  412. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  413. uae_u32 dest;
  414. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  415. for (j=0;j<b->vblitsize;j++) {
  416.     for(i=0;i<count;i++) {
  417.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  418.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  419.         dest = (~srcb & srca);
  420.         totald |= dest;
  421.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  422.     }
  423.     if (oddword) {
  424.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  425.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  426.         dest = (~srcb & srca);
  427.         totald |= dest;
  428.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  429.     }
  430.     if (pta) pta -= b->bltamod;
  431.     if (ptb) ptb -= b->bltbmod;
  432.     if (ptd) ptd-=b->bltdmod;
  433. }
  434. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  435. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  436. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  437. } else {
  438. uae_u32 preva = 0;
  439. uae_u32 prevb = 0, srcb = b->bltbhold;
  440. uae_u32 dstd=0;
  441. uae_u16 foo, *dstp = &foo;
  442. for (j = 0; j < b->vblitsize; j++) {
  443.     for (i = 0; i < b->hblitsize; i++) {
  444.         uae_u32 bltadat, srca;
  445.         if (ptb) {
  446.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  447.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  448.             prevb = bltbdat;
  449.         }
  450.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  451.         bltadat &= blit_masktable[i];
  452.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  453.         preva = bltadat;
  454.         do_put_mem_word (dstp, dstd);
  455.         dstd = ((~srcb & srca)) & 0xFFFF;
  456.         totald |= dstd;
  457.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  458.     }
  459.     if (pta) pta -= b->bltamod;
  460.     if (ptb) ptb -= b->bltbmod;
  461.     if (ptd) ptd -= b->bltdmod;
  462. }
  463. b->bltbhold = srcb;
  464.         do_put_mem_word (dstp, dstd);
  465. }
  466. if (totald == 0) b->blitzero = 1;
  467. }
  468. void blitdofast_3a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  469. {
  470. int i,j;
  471. uae_u32 totald = 0;
  472. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  473. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  474. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  475. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  476. uae_u32 dest;
  477. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  478. for (j=0;j<b->vblitsize;j++) {
  479.     for(i=0;i<count;i++) {
  480.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  481.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  482.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  483.         dest = ((srcc & ~srca) | ~(srcb | ~srca));
  484.         totald |= dest;
  485.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  486.     }
  487.     if (oddword) {
  488.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  489.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  490.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  491.         dest = ((srcc & ~srca) | ~(srcb | ~srca));
  492.         totald |= dest;
  493.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  494.     }
  495.     if (pta) pta += b->bltamod;
  496.     if (ptb) ptb += b->bltbmod;
  497.     if (ptc) ptc += b->bltcmod;
  498.     if (ptd) ptd += b->bltdmod;
  499. }
  500. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  501. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  502. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  503. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  504. } else {
  505. uae_u32 preva = 0;
  506. uae_u32 prevb = 0, srcb = b->bltbhold;
  507. uae_u32 srcc = b->bltcdat;
  508. uae_u32 dstd=0;
  509. uae_u16 foo, *dstp = &foo;
  510. for (j = 0; j < b->vblitsize; j++) {
  511.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  512.  
  513.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  514.         if (ptb) {
  515.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  516.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  517.             prevb = bltbdat;
  518.         }
  519.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  520.         bltadat &= blit_masktable[i];
  521.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  522.         preva = bltadat;
  523.         do_put_mem_word (dstp, dstd);
  524.         dstd = (((srcc & ~srca) | ~(srcb | ~srca))) & 0xFFFF;
  525.         totald |= dstd;
  526.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  527.     }
  528.     if (pta) pta += b->bltamod;
  529.     if (ptb) ptb += b->bltbmod;
  530.     if (ptc) ptc += b->bltcmod;
  531.     if (ptd) ptd += b->bltdmod;
  532. }
  533. b->bltbhold = srcb;
  534. b->bltcdat = srcc;
  535.         do_put_mem_word (dstp, dstd);
  536. }
  537. if (totald == 0) b->blitzero = 1;
  538. }
  539. void blitdofast_desc_3a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  540. {
  541. uae_u32 totald = 0;
  542. int i,j;
  543. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  544. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  545. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  546. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  547. uae_u32 dest;
  548. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  549. for (j=0;j<b->vblitsize;j++) {
  550.     for(i=0;i<count;i++) {
  551.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  552.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  553.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  554.         dest = ((srcc & ~srca) | ~(srcb | ~srca));
  555.         totald |= dest;
  556.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  557.     }
  558.     if (oddword) {
  559.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  560.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  561.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  562.         dest = ((srcc & ~srca) | ~(srcb | ~srca));
  563.         totald |= dest;
  564.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  565.     }
  566.     if (pta) pta -= b->bltamod;
  567.     if (ptb) ptb -= b->bltbmod;
  568.     if (ptc) ptc -= b->bltcmod;
  569.     if (ptd) ptd-=b->bltdmod;
  570. }
  571. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  572. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  573. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  574. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  575. } else {
  576. uae_u32 preva = 0;
  577. uae_u32 prevb = 0, srcb = b->bltbhold;
  578. uae_u32 srcc = b->bltcdat;
  579. uae_u32 dstd=0;
  580. uae_u16 foo, *dstp = &foo;
  581. for (j = 0; j < b->vblitsize; j++) {
  582.     for (i = 0; i < b->hblitsize; i++) {
  583.         uae_u32 bltadat, srca;
  584.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  585.         if (ptb) {
  586.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  587.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  588.             prevb = bltbdat;
  589.         }
  590.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  591.         bltadat &= blit_masktable[i];
  592.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  593.         preva = bltadat;
  594.         do_put_mem_word (dstp, dstd);
  595.         dstd = (((srcc & ~srca) | ~(srcb | ~srca))) & 0xFFFF;
  596.         totald |= dstd;
  597.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  598.     }
  599.     if (pta) pta -= b->bltamod;
  600.     if (ptb) ptb -= b->bltbmod;
  601.     if (ptc) ptc -= b->bltcmod;
  602.     if (ptd) ptd -= b->bltdmod;
  603. }
  604. b->bltbhold = srcb;
  605. b->bltcdat = srcc;
  606.         do_put_mem_word (dstp, dstd);
  607. }
  608. if (totald == 0) b->blitzero = 1;
  609. }
  610. void blitdofast_3c(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  611. {
  612. int i,j;
  613. uae_u32 totald = 0;
  614. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  615. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  616. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  617. uae_u32 dest;
  618. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  619. for (j=0;j<b->vblitsize;j++) {
  620.     for(i=0;i<count;i++) {
  621.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  622.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  623.         dest = (srcb ^ srca);
  624.         totald |= dest;
  625.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  626.     }
  627.     if (oddword) {
  628.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  629.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  630.         dest = (srcb ^ srca);
  631.         totald |= dest;
  632.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  633.     }
  634.     if (pta) pta += b->bltamod;
  635.     if (ptb) ptb += b->bltbmod;
  636.     if (ptd) ptd += b->bltdmod;
  637. }
  638. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  639. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  640. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  641. } else {
  642. uae_u32 preva = 0;
  643. uae_u32 prevb = 0, srcb = b->bltbhold;
  644. uae_u32 dstd=0;
  645. uae_u16 foo, *dstp = &foo;
  646. for (j = 0; j < b->vblitsize; j++) {
  647.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  648.  
  649.         if (ptb) {
  650.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  651.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  652.             prevb = bltbdat;
  653.         }
  654.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  655.         bltadat &= blit_masktable[i];
  656.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  657.         preva = bltadat;
  658.         do_put_mem_word (dstp, dstd);
  659.         dstd = ((srcb ^ srca)) & 0xFFFF;
  660.         totald |= dstd;
  661.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  662.     }
  663.     if (pta) pta += b->bltamod;
  664.     if (ptb) ptb += b->bltbmod;
  665.     if (ptd) ptd += b->bltdmod;
  666. }
  667. b->bltbhold = srcb;
  668.         do_put_mem_word (dstp, dstd);
  669. }
  670. if (totald == 0) b->blitzero = 1;
  671. }
  672. void blitdofast_desc_3c(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  673. {
  674. uae_u32 totald = 0;
  675. int i,j;
  676. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  677. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  678. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  679. uae_u32 dest;
  680. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  681. for (j=0;j<b->vblitsize;j++) {
  682.     for(i=0;i<count;i++) {
  683.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  684.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  685.         dest = (srcb ^ srca);
  686.         totald |= dest;
  687.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  688.     }
  689.     if (oddword) {
  690.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  691.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  692.         dest = (srcb ^ srca);
  693.         totald |= dest;
  694.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  695.     }
  696.     if (pta) pta -= b->bltamod;
  697.     if (ptb) ptb -= b->bltbmod;
  698.     if (ptd) ptd-=b->bltdmod;
  699. }
  700. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  701. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  702. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  703. } else {
  704. uae_u32 preva = 0;
  705. uae_u32 prevb = 0, srcb = b->bltbhold;
  706. uae_u32 dstd=0;
  707. uae_u16 foo, *dstp = &foo;
  708. for (j = 0; j < b->vblitsize; j++) {
  709.     for (i = 0; i < b->hblitsize; i++) {
  710.         uae_u32 bltadat, srca;
  711.         if (ptb) {
  712.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  713.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  714.             prevb = bltbdat;
  715.         }
  716.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  717.         bltadat &= blit_masktable[i];
  718.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  719.         preva = bltadat;
  720.         do_put_mem_word (dstp, dstd);
  721.         dstd = ((srcb ^ srca)) & 0xFFFF;
  722.         totald |= dstd;
  723.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  724.     }
  725.     if (pta) pta -= b->bltamod;
  726.     if (ptb) ptb -= b->bltbmod;
  727.     if (ptd) ptd -= b->bltdmod;
  728. }
  729. b->bltbhold = srcb;
  730.         do_put_mem_word (dstp, dstd);
  731. }
  732. if (totald == 0) b->blitzero = 1;
  733. }
  734. void blitdofast_4a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  735. {
  736. int i,j;
  737. uae_u32 totald = 0;
  738. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  739. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  740. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  741. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  742. uae_u32 dest;
  743. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  744. for (j=0;j<b->vblitsize;j++) {
  745.     for(i=0;i<count;i++) {
  746.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  747.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  748.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  749.         dest = (~(~srcc | srca) | (~srcc & srcb & srca));
  750.         totald |= dest;
  751.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  752.     }
  753.     if (oddword) {
  754.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  755.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  756.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  757.         dest = (~(~srcc | srca) | (~srcc & srcb & srca));
  758.         totald |= dest;
  759.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  760.     }
  761.     if (pta) pta += b->bltamod;
  762.     if (ptb) ptb += b->bltbmod;
  763.     if (ptc) ptc += b->bltcmod;
  764.     if (ptd) ptd += b->bltdmod;
  765. }
  766. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  767. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  768. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  769. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  770. } else {
  771. uae_u32 preva = 0;
  772. uae_u32 prevb = 0, srcb = b->bltbhold;
  773. uae_u32 srcc = b->bltcdat;
  774. uae_u32 dstd=0;
  775. uae_u16 foo, *dstp = &foo;
  776. for (j = 0; j < b->vblitsize; j++) {
  777.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  778.  
  779.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  780.         if (ptb) {
  781.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  782.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  783.             prevb = bltbdat;
  784.         }
  785.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  786.         bltadat &= blit_masktable[i];
  787.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  788.         preva = bltadat;
  789.         do_put_mem_word (dstp, dstd);
  790.         dstd = ((~(~srcc | srca) | (~srcc & srcb & srca))) & 0xFFFF;
  791.         totald |= dstd;
  792.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  793.     }
  794.     if (pta) pta += b->bltamod;
  795.     if (ptb) ptb += b->bltbmod;
  796.     if (ptc) ptc += b->bltcmod;
  797.     if (ptd) ptd += b->bltdmod;
  798. }
  799. b->bltbhold = srcb;
  800. b->bltcdat = srcc;
  801.         do_put_mem_word (dstp, dstd);
  802. }
  803. if (totald == 0) b->blitzero = 1;
  804. }
  805. void blitdofast_desc_4a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  806. {
  807. uae_u32 totald = 0;
  808. int i,j;
  809. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  810. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  811. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  812. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  813. uae_u32 dest;
  814. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  815. for (j=0;j<b->vblitsize;j++) {
  816.     for(i=0;i<count;i++) {
  817.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  818.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  819.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  820.         dest = (~(~srcc | srca) | (~srcc & srcb & srca));
  821.         totald |= dest;
  822.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  823.     }
  824.     if (oddword) {
  825.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  826.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  827.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  828.         dest = (~(~srcc | srca) | (~srcc & srcb & srca));
  829.         totald |= dest;
  830.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  831.     }
  832.     if (pta) pta -= b->bltamod;
  833.     if (ptb) ptb -= b->bltbmod;
  834.     if (ptc) ptc -= b->bltcmod;
  835.     if (ptd) ptd-=b->bltdmod;
  836. }
  837. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  838. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  839. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  840. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  841. } else {
  842. uae_u32 preva = 0;
  843. uae_u32 prevb = 0, srcb = b->bltbhold;
  844. uae_u32 srcc = b->bltcdat;
  845. uae_u32 dstd=0;
  846. uae_u16 foo, *dstp = &foo;
  847. for (j = 0; j < b->vblitsize; j++) {
  848.     for (i = 0; i < b->hblitsize; i++) {
  849.         uae_u32 bltadat, srca;
  850.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  851.         if (ptb) {
  852.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  853.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  854.             prevb = bltbdat;
  855.         }
  856.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  857.         bltadat &= blit_masktable[i];
  858.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  859.         preva = bltadat;
  860.         do_put_mem_word (dstp, dstd);
  861.         dstd = ((~(~srcc | srca) | (~srcc & srcb & srca))) & 0xFFFF;
  862.         totald |= dstd;
  863.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  864.     }
  865.     if (pta) pta -= b->bltamod;
  866.     if (ptb) ptb -= b->bltbmod;
  867.     if (ptc) ptc -= b->bltcmod;
  868.     if (ptd) ptd -= b->bltdmod;
  869. }
  870. b->bltbhold = srcb;
  871. b->bltcdat = srcc;
  872.         do_put_mem_word (dstp, dstd);
  873. }
  874. if (totald == 0) b->blitzero = 1;
  875. }
  876. void blitdofast_6a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  877. {
  878. int i,j;
  879. uae_u32 totald = 0;
  880. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  881. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  882. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  883. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  884. uae_u32 dest;
  885. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  886. for (j=0;j<b->vblitsize;j++) {
  887.     for(i=0;i<count;i++) {
  888.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  889.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  890.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  891.         dest = (srcc ^ (srca & srcb));
  892.         totald |= dest;
  893.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  894.     }
  895.     if (oddword) {
  896.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  897.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  898.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  899.         dest = (srcc ^ (srca & srcb));
  900.         totald |= dest;
  901.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  902.     }
  903.     if (pta) pta += b->bltamod;
  904.     if (ptb) ptb += b->bltbmod;
  905.     if (ptc) ptc += b->bltcmod;
  906.     if (ptd) ptd += b->bltdmod;
  907. }
  908. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  909. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  910. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  911. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  912. } else {
  913. uae_u32 preva = 0;
  914. uae_u32 prevb = 0, srcb = b->bltbhold;
  915. uae_u32 srcc = b->bltcdat;
  916. uae_u32 dstd=0;
  917. uae_u16 foo, *dstp = &foo;
  918. for (j = 0; j < b->vblitsize; j++) {
  919.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  920.  
  921.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  922.         if (ptb) {
  923.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  924.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  925.             prevb = bltbdat;
  926.         }
  927.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  928.         bltadat &= blit_masktable[i];
  929.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  930.         preva = bltadat;
  931.         do_put_mem_word (dstp, dstd);
  932.         dstd = ((srcc ^ (srca & srcb))) & 0xFFFF;
  933.         totald |= dstd;
  934.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  935.     }
  936.     if (pta) pta += b->bltamod;
  937.     if (ptb) ptb += b->bltbmod;
  938.     if (ptc) ptc += b->bltcmod;
  939.     if (ptd) ptd += b->bltdmod;
  940. }
  941. b->bltbhold = srcb;
  942. b->bltcdat = srcc;
  943.         do_put_mem_word (dstp, dstd);
  944. }
  945. if (totald == 0) b->blitzero = 1;
  946. }
  947. void blitdofast_desc_6a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  948. {
  949. uae_u32 totald = 0;
  950. int i,j;
  951. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  952. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  953. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  954. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  955. uae_u32 dest;
  956. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  957. for (j=0;j<b->vblitsize;j++) {
  958.     for(i=0;i<count;i++) {
  959.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  960.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  961.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  962.         dest = (srcc ^ (srca & srcb));
  963.         totald |= dest;
  964.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  965.     }
  966.     if (oddword) {
  967.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  968.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  969.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  970.         dest = (srcc ^ (srca & srcb));
  971.         totald |= dest;
  972.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  973.     }
  974.     if (pta) pta -= b->bltamod;
  975.     if (ptb) ptb -= b->bltbmod;
  976.     if (ptc) ptc -= b->bltcmod;
  977.     if (ptd) ptd-=b->bltdmod;
  978. }
  979. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  980. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  981. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  982. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  983. } else {
  984. uae_u32 preva = 0;
  985. uae_u32 prevb = 0, srcb = b->bltbhold;
  986. uae_u32 srcc = b->bltcdat;
  987. uae_u32 dstd=0;
  988. uae_u16 foo, *dstp = &foo;
  989. for (j = 0; j < b->vblitsize; j++) {
  990.     for (i = 0; i < b->hblitsize; i++) {
  991.         uae_u32 bltadat, srca;
  992.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  993.         if (ptb) {
  994.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  995.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  996.             prevb = bltbdat;
  997.         }
  998.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  999.         bltadat &= blit_masktable[i];
  1000.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1001.         preva = bltadat;
  1002.         do_put_mem_word (dstp, dstd);
  1003.         dstd = ((srcc ^ (srca & srcb))) & 0xFFFF;
  1004.         totald |= dstd;
  1005.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1006.     }
  1007.     if (pta) pta -= b->bltamod;
  1008.     if (ptb) ptb -= b->bltbmod;
  1009.     if (ptc) ptc -= b->bltcmod;
  1010.     if (ptd) ptd -= b->bltdmod;
  1011. }
  1012. b->bltbhold = srcb;
  1013. b->bltcdat = srcc;
  1014.         do_put_mem_word (dstp, dstd);
  1015. }
  1016. if (totald == 0) b->blitzero = 1;
  1017. }
  1018. void blitdofast_8a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1019. {
  1020. int i,j;
  1021. uae_u32 totald = 0;
  1022. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1023. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1024. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1025. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1026. uae_u32 dest;
  1027. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1028. for (j=0;j<b->vblitsize;j++) {
  1029.     for(i=0;i<count;i++) {
  1030.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1031.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1032.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1033.         dest = (srcc & (srcb | ~srca));
  1034.         totald |= dest;
  1035.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1036.     }
  1037.     if (oddword) {
  1038.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1039.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1040.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1041.         dest = (srcc & (srcb | ~srca));
  1042.         totald |= dest;
  1043.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1044.     }
  1045.     if (pta) pta += b->bltamod;
  1046.     if (ptb) ptb += b->bltbmod;
  1047.     if (ptc) ptc += b->bltcmod;
  1048.     if (ptd) ptd += b->bltdmod;
  1049. }
  1050. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1051. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1052. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1053. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1054. } else {
  1055. uae_u32 preva = 0;
  1056. uae_u32 prevb = 0, srcb = b->bltbhold;
  1057. uae_u32 srcc = b->bltcdat;
  1058. uae_u32 dstd=0;
  1059. uae_u16 foo, *dstp = &foo;
  1060. for (j = 0; j < b->vblitsize; j++) {
  1061.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1062.  
  1063.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1064.         if (ptb) {
  1065.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1066.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1067.             prevb = bltbdat;
  1068.         }
  1069.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1070.         bltadat &= blit_masktable[i];
  1071.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1072.         preva = bltadat;
  1073.         do_put_mem_word (dstp, dstd);
  1074.         dstd = ((srcc & (srcb | ~srca))) & 0xFFFF;
  1075.         totald |= dstd;
  1076.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1077.     }
  1078.     if (pta) pta += b->bltamod;
  1079.     if (ptb) ptb += b->bltbmod;
  1080.     if (ptc) ptc += b->bltcmod;
  1081.     if (ptd) ptd += b->bltdmod;
  1082. }
  1083. b->bltbhold = srcb;
  1084. b->bltcdat = srcc;
  1085.         do_put_mem_word (dstp, dstd);
  1086. }
  1087. if (totald == 0) b->blitzero = 1;
  1088. }
  1089. void blitdofast_desc_8a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1090. {
  1091. uae_u32 totald = 0;
  1092. int i,j;
  1093. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1094. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1095. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1096. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1097. uae_u32 dest;
  1098. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1099. for (j=0;j<b->vblitsize;j++) {
  1100.     for(i=0;i<count;i++) {
  1101.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1102.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1103.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1104.         dest = (srcc & (srcb | ~srca));
  1105.         totald |= dest;
  1106.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1107.     }
  1108.     if (oddword) {
  1109.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1110.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1111.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1112.         dest = (srcc & (srcb | ~srca));
  1113.         totald |= dest;
  1114.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1115.     }
  1116.     if (pta) pta -= b->bltamod;
  1117.     if (ptb) ptb -= b->bltbmod;
  1118.     if (ptc) ptc -= b->bltcmod;
  1119.     if (ptd) ptd-=b->bltdmod;
  1120. }
  1121. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1122. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1123. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1124. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1125. } else {
  1126. uae_u32 preva = 0;
  1127. uae_u32 prevb = 0, srcb = b->bltbhold;
  1128. uae_u32 srcc = b->bltcdat;
  1129. uae_u32 dstd=0;
  1130. uae_u16 foo, *dstp = &foo;
  1131. for (j = 0; j < b->vblitsize; j++) {
  1132.     for (i = 0; i < b->hblitsize; i++) {
  1133.         uae_u32 bltadat, srca;
  1134.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1135.         if (ptb) {
  1136.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1137.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1138.             prevb = bltbdat;
  1139.         }
  1140.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1141.         bltadat &= blit_masktable[i];
  1142.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1143.         preva = bltadat;
  1144.         do_put_mem_word (dstp, dstd);
  1145.         dstd = ((srcc & (srcb | ~srca))) & 0xFFFF;
  1146.         totald |= dstd;
  1147.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1148.     }
  1149.     if (pta) pta -= b->bltamod;
  1150.     if (ptb) ptb -= b->bltbmod;
  1151.     if (ptc) ptc -= b->bltcmod;
  1152.     if (ptd) ptd -= b->bltdmod;
  1153. }
  1154. b->bltbhold = srcb;
  1155. b->bltcdat = srcc;
  1156.         do_put_mem_word (dstp, dstd);
  1157. }
  1158. if (totald == 0) b->blitzero = 1;
  1159. }
  1160. void blitdofast_8c(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1161. {
  1162. int i,j;
  1163. uae_u32 totald = 0;
  1164. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1165. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1166. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1167. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1168. uae_u32 dest;
  1169. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1170. for (j=0;j<b->vblitsize;j++) {
  1171.     for(i=0;i<count;i++) {
  1172.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1173.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1174.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1175.         dest = (srcb & (srcc | ~srca));
  1176.         totald |= dest;
  1177.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1178.     }
  1179.     if (oddword) {
  1180.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1181.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1182.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1183.         dest = (srcb & (srcc | ~srca));
  1184.         totald |= dest;
  1185.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1186.     }
  1187.     if (pta) pta += b->bltamod;
  1188.     if (ptb) ptb += b->bltbmod;
  1189.     if (ptc) ptc += b->bltcmod;
  1190.     if (ptd) ptd += b->bltdmod;
  1191. }
  1192. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1193. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1194. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1195. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1196. } else {
  1197. uae_u32 preva = 0;
  1198. uae_u32 prevb = 0, srcb = b->bltbhold;
  1199. uae_u32 srcc = b->bltcdat;
  1200. uae_u32 dstd=0;
  1201. uae_u16 foo, *dstp = &foo;
  1202. for (j = 0; j < b->vblitsize; j++) {
  1203.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1204.  
  1205.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1206.         if (ptb) {
  1207.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1208.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1209.             prevb = bltbdat;
  1210.         }
  1211.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1212.         bltadat &= blit_masktable[i];
  1213.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1214.         preva = bltadat;
  1215.         do_put_mem_word (dstp, dstd);
  1216.         dstd = ((srcb & (srcc | ~srca))) & 0xFFFF;
  1217.         totald |= dstd;
  1218.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1219.     }
  1220.     if (pta) pta += b->bltamod;
  1221.     if (ptb) ptb += b->bltbmod;
  1222.     if (ptc) ptc += b->bltcmod;
  1223.     if (ptd) ptd += b->bltdmod;
  1224. }
  1225. b->bltbhold = srcb;
  1226. b->bltcdat = srcc;
  1227.         do_put_mem_word (dstp, dstd);
  1228. }
  1229. if (totald == 0) b->blitzero = 1;
  1230. }
  1231. void blitdofast_desc_8c(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1232. {
  1233. uae_u32 totald = 0;
  1234. int i,j;
  1235. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1236. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1237. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1238. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1239. uae_u32 dest;
  1240. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1241. for (j=0;j<b->vblitsize;j++) {
  1242.     for(i=0;i<count;i++) {
  1243.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1244.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1245.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1246.         dest = (srcb & (srcc | ~srca));
  1247.         totald |= dest;
  1248.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1249.     }
  1250.     if (oddword) {
  1251.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1252.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1253.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1254.         dest = (srcb & (srcc | ~srca));
  1255.         totald |= dest;
  1256.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1257.     }
  1258.     if (pta) pta -= b->bltamod;
  1259.     if (ptb) ptb -= b->bltbmod;
  1260.     if (ptc) ptc -= b->bltcmod;
  1261.     if (ptd) ptd-=b->bltdmod;
  1262. }
  1263. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1264. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1265. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1266. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1267. } else {
  1268. uae_u32 preva = 0;
  1269. uae_u32 prevb = 0, srcb = b->bltbhold;
  1270. uae_u32 srcc = b->bltcdat;
  1271. uae_u32 dstd=0;
  1272. uae_u16 foo, *dstp = &foo;
  1273. for (j = 0; j < b->vblitsize; j++) {
  1274.     for (i = 0; i < b->hblitsize; i++) {
  1275.         uae_u32 bltadat, srca;
  1276.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1277.         if (ptb) {
  1278.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1279.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1280.             prevb = bltbdat;
  1281.         }
  1282.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1283.         bltadat &= blit_masktable[i];
  1284.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1285.         preva = bltadat;
  1286.         do_put_mem_word (dstp, dstd);
  1287.         dstd = ((srcb & (srcc | ~srca))) & 0xFFFF;
  1288.         totald |= dstd;
  1289.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1290.     }
  1291.     if (pta) pta -= b->bltamod;
  1292.     if (ptb) ptb -= b->bltbmod;
  1293.     if (ptc) ptc -= b->bltcmod;
  1294.     if (ptd) ptd -= b->bltdmod;
  1295. }
  1296. b->bltbhold = srcb;
  1297. b->bltcdat = srcc;
  1298.         do_put_mem_word (dstp, dstd);
  1299. }
  1300. if (totald == 0) b->blitzero = 1;
  1301. }
  1302. void blitdofast_9a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1303. {
  1304. int i,j;
  1305. uae_u32 totald = 0;
  1306. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1307. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1308. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1309. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1310. uae_u32 dest;
  1311. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1312. for (j=0;j<b->vblitsize;j++) {
  1313.     for(i=0;i<count;i++) {
  1314.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1315.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1316.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1317.         dest = (srcc ^ (srca & ~srcb));
  1318.         totald |= dest;
  1319.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1320.     }
  1321.     if (oddword) {
  1322.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1323.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1324.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1325.         dest = (srcc ^ (srca & ~srcb));
  1326.         totald |= dest;
  1327.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1328.     }
  1329.     if (pta) pta += b->bltamod;
  1330.     if (ptb) ptb += b->bltbmod;
  1331.     if (ptc) ptc += b->bltcmod;
  1332.     if (ptd) ptd += b->bltdmod;
  1333. }
  1334. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1335. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1336. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1337. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1338. } else {
  1339. uae_u32 preva = 0;
  1340. uae_u32 prevb = 0, srcb = b->bltbhold;
  1341. uae_u32 srcc = b->bltcdat;
  1342. uae_u32 dstd=0;
  1343. uae_u16 foo, *dstp = &foo;
  1344. for (j = 0; j < b->vblitsize; j++) {
  1345.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1346.  
  1347.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1348.         if (ptb) {
  1349.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1350.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1351.             prevb = bltbdat;
  1352.         }
  1353.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1354.         bltadat &= blit_masktable[i];
  1355.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1356.         preva = bltadat;
  1357.         do_put_mem_word (dstp, dstd);
  1358.         dstd = ((srcc ^ (srca & ~srcb))) & 0xFFFF;
  1359.         totald |= dstd;
  1360.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1361.     }
  1362.     if (pta) pta += b->bltamod;
  1363.     if (ptb) ptb += b->bltbmod;
  1364.     if (ptc) ptc += b->bltcmod;
  1365.     if (ptd) ptd += b->bltdmod;
  1366. }
  1367. b->bltbhold = srcb;
  1368. b->bltcdat = srcc;
  1369.         do_put_mem_word (dstp, dstd);
  1370. }
  1371. if (totald == 0) b->blitzero = 1;
  1372. }
  1373. void blitdofast_desc_9a(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1374. {
  1375. uae_u32 totald = 0;
  1376. int i,j;
  1377. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1378. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1379. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1380. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1381. uae_u32 dest;
  1382. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1383. for (j=0;j<b->vblitsize;j++) {
  1384.     for(i=0;i<count;i++) {
  1385.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1386.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1387.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1388.         dest = (srcc ^ (srca & ~srcb));
  1389.         totald |= dest;
  1390.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1391.     }
  1392.     if (oddword) {
  1393.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1394.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1395.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1396.         dest = (srcc ^ (srca & ~srcb));
  1397.         totald |= dest;
  1398.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1399.     }
  1400.     if (pta) pta -= b->bltamod;
  1401.     if (ptb) ptb -= b->bltbmod;
  1402.     if (ptc) ptc -= b->bltcmod;
  1403.     if (ptd) ptd-=b->bltdmod;
  1404. }
  1405. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1406. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1407. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1408. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1409. } else {
  1410. uae_u32 preva = 0;
  1411. uae_u32 prevb = 0, srcb = b->bltbhold;
  1412. uae_u32 srcc = b->bltcdat;
  1413. uae_u32 dstd=0;
  1414. uae_u16 foo, *dstp = &foo;
  1415. for (j = 0; j < b->vblitsize; j++) {
  1416.     for (i = 0; i < b->hblitsize; i++) {
  1417.         uae_u32 bltadat, srca;
  1418.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1419.         if (ptb) {
  1420.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1421.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1422.             prevb = bltbdat;
  1423.         }
  1424.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1425.         bltadat &= blit_masktable[i];
  1426.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1427.         preva = bltadat;
  1428.         do_put_mem_word (dstp, dstd);
  1429.         dstd = ((srcc ^ (srca & ~srcb))) & 0xFFFF;
  1430.         totald |= dstd;
  1431.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1432.     }
  1433.     if (pta) pta -= b->bltamod;
  1434.     if (ptb) ptb -= b->bltbmod;
  1435.     if (ptc) ptc -= b->bltcmod;
  1436.     if (ptd) ptd -= b->bltdmod;
  1437. }
  1438. b->bltbhold = srcb;
  1439. b->bltcdat = srcc;
  1440.         do_put_mem_word (dstp, dstd);
  1441. }
  1442. if (totald == 0) b->blitzero = 1;
  1443. }
  1444. void blitdofast_a8(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1445. {
  1446. int i,j;
  1447. uae_u32 totald = 0;
  1448. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1449. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1450. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1451. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1452. uae_u32 dest;
  1453. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1454. for (j=0;j<b->vblitsize;j++) {
  1455.     for(i=0;i<count;i++) {
  1456.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1457.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1458.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1459.         dest = (srcc & (srca | srcb));
  1460.         totald |= dest;
  1461.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1462.     }
  1463.     if (oddword) {
  1464.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1465.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1466.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1467.         dest = (srcc & (srca | srcb));
  1468.         totald |= dest;
  1469.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1470.     }
  1471.     if (pta) pta += b->bltamod;
  1472.     if (ptb) ptb += b->bltbmod;
  1473.     if (ptc) ptc += b->bltcmod;
  1474.     if (ptd) ptd += b->bltdmod;
  1475. }
  1476. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1477. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1478. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1479. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1480. } else {
  1481. uae_u32 preva = 0;
  1482. uae_u32 prevb = 0, srcb = b->bltbhold;
  1483. uae_u32 srcc = b->bltcdat;
  1484. uae_u32 dstd=0;
  1485. uae_u16 foo, *dstp = &foo;
  1486. for (j = 0; j < b->vblitsize; j++) {
  1487.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1488.  
  1489.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1490.         if (ptb) {
  1491.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1492.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1493.             prevb = bltbdat;
  1494.         }
  1495.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1496.         bltadat &= blit_masktable[i];
  1497.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1498.         preva = bltadat;
  1499.         do_put_mem_word (dstp, dstd);
  1500.         dstd = ((srcc & (srca | srcb))) & 0xFFFF;
  1501.         totald |= dstd;
  1502.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1503.     }
  1504.     if (pta) pta += b->bltamod;
  1505.     if (ptb) ptb += b->bltbmod;
  1506.     if (ptc) ptc += b->bltcmod;
  1507.     if (ptd) ptd += b->bltdmod;
  1508. }
  1509. b->bltbhold = srcb;
  1510. b->bltcdat = srcc;
  1511.         do_put_mem_word (dstp, dstd);
  1512. }
  1513. if (totald == 0) b->blitzero = 1;
  1514. }
  1515. void blitdofast_desc_a8(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1516. {
  1517. uae_u32 totald = 0;
  1518. int i,j;
  1519. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1520. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1521. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1522. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1523. uae_u32 dest;
  1524. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1525. for (j=0;j<b->vblitsize;j++) {
  1526.     for(i=0;i<count;i++) {
  1527.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1528.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1529.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1530.         dest = (srcc & (srca | srcb));
  1531.         totald |= dest;
  1532.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1533.     }
  1534.     if (oddword) {
  1535.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1536.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1537.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1538.         dest = (srcc & (srca | srcb));
  1539.         totald |= dest;
  1540.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1541.     }
  1542.     if (pta) pta -= b->bltamod;
  1543.     if (ptb) ptb -= b->bltbmod;
  1544.     if (ptc) ptc -= b->bltcmod;
  1545.     if (ptd) ptd-=b->bltdmod;
  1546. }
  1547. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1548. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1549. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1550. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1551. } else {
  1552. uae_u32 preva = 0;
  1553. uae_u32 prevb = 0, srcb = b->bltbhold;
  1554. uae_u32 srcc = b->bltcdat;
  1555. uae_u32 dstd=0;
  1556. uae_u16 foo, *dstp = &foo;
  1557. for (j = 0; j < b->vblitsize; j++) {
  1558.     for (i = 0; i < b->hblitsize; i++) {
  1559.         uae_u32 bltadat, srca;
  1560.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1561.         if (ptb) {
  1562.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1563.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1564.             prevb = bltbdat;
  1565.         }
  1566.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1567.         bltadat &= blit_masktable[i];
  1568.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1569.         preva = bltadat;
  1570.         do_put_mem_word (dstp, dstd);
  1571.         dstd = ((srcc & (srca | srcb))) & 0xFFFF;
  1572.         totald |= dstd;
  1573.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1574.     }
  1575.     if (pta) pta -= b->bltamod;
  1576.     if (ptb) ptb -= b->bltbmod;
  1577.     if (ptc) ptc -= b->bltcmod;
  1578.     if (ptd) ptd -= b->bltdmod;
  1579. }
  1580. b->bltbhold = srcb;
  1581. b->bltcdat = srcc;
  1582.         do_put_mem_word (dstp, dstd);
  1583. }
  1584. if (totald == 0) b->blitzero = 1;
  1585. }
  1586. void blitdofast_aa(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1587. {
  1588. int i,j;
  1589. uae_u32 totald = 0;
  1590. if (currprefs.blits_32bit_enabled && b->hblitsize > 1) {
  1591. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1592. uae_u32 dest;
  1593. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1594. for (j=0;j<b->vblitsize;j++) {
  1595.     for(i=0;i<count;i++) {
  1596.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1597.         dest = srcc;
  1598.         totald |= dest;
  1599.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1600.     }
  1601.     if (oddword) {
  1602.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1603.         dest = srcc;
  1604.         totald |= dest;
  1605.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1606.     }
  1607.     if (ptc) ptc += b->bltcmod;
  1608.     if (ptd) ptd += b->bltdmod;
  1609. }
  1610. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1611. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1612. } else {
  1613. uae_u32 srcc = b->bltcdat;
  1614. uae_u32 dstd=0;
  1615. uae_u16 foo, *dstp = &foo;
  1616. for (j = 0; j < b->vblitsize; j++) {
  1617.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1618.  
  1619.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1620.         do_put_mem_word (dstp, dstd);
  1621.         dstd = (srcc) & 0xFFFF;
  1622.         totald |= dstd;
  1623.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1624.     }
  1625.     if (ptc) ptc += b->bltcmod;
  1626.     if (ptd) ptd += b->bltdmod;
  1627. }
  1628. b->bltcdat = srcc;
  1629.         do_put_mem_word (dstp, dstd);
  1630. }
  1631. if (totald == 0) b->blitzero = 1;
  1632. }
  1633. void blitdofast_desc_aa(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1634. {
  1635. uae_u32 totald = 0;
  1636. int i,j;
  1637. if (currprefs.blits_32bit_enabled && b->hblitsize > 1) {
  1638. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1639. uae_u32 dest;
  1640. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1641. for (j=0;j<b->vblitsize;j++) {
  1642.     for(i=0;i<count;i++) {
  1643.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1644.         dest = srcc;
  1645.         totald |= dest;
  1646.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1647.     }
  1648.     if (oddword) {
  1649.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1650.         dest = srcc;
  1651.         totald |= dest;
  1652.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1653.     }
  1654.     if (ptc) ptc -= b->bltcmod;
  1655.     if (ptd) ptd-=b->bltdmod;
  1656. }
  1657. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1658. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1659. } else {
  1660. uae_u32 srcc = b->bltcdat;
  1661. uae_u32 dstd=0;
  1662. uae_u16 foo, *dstp = &foo;
  1663. for (j = 0; j < b->vblitsize; j++) {
  1664.     for (i = 0; i < b->hblitsize; i++) {
  1665.         uae_u32 bltadat, srca;
  1666.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1667.         do_put_mem_word (dstp, dstd);
  1668.         dstd = (srcc) & 0xFFFF;
  1669.         totald |= dstd;
  1670.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1671.     }
  1672.     if (ptc) ptc -= b->bltcmod;
  1673.     if (ptd) ptd -= b->bltdmod;
  1674. }
  1675. b->bltcdat = srcc;
  1676.         do_put_mem_word (dstp, dstd);
  1677. }
  1678. if (totald == 0) b->blitzero = 1;
  1679. }
  1680. void blitdofast_b1(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1681. {
  1682. int i,j;
  1683. uae_u32 totald = 0;
  1684. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1685. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1686. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1687. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1688. uae_u32 dest;
  1689. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1690. for (j=0;j<b->vblitsize;j++) {
  1691.     for(i=0;i<count;i++) {
  1692.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1693.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1694.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1695.         dest = (~(srcb | (~srca & srcc)) | (srcc & srca));
  1696.         totald |= dest;
  1697.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1698.     }
  1699.     if (oddword) {
  1700.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1701.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1702.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1703.         dest = (~(srcb | (~srca & srcc)) | (srcc & srca));
  1704.         totald |= dest;
  1705.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1706.     }
  1707.     if (pta) pta += b->bltamod;
  1708.     if (ptb) ptb += b->bltbmod;
  1709.     if (ptc) ptc += b->bltcmod;
  1710.     if (ptd) ptd += b->bltdmod;
  1711. }
  1712. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1713. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1714. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1715. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1716. } else {
  1717. uae_u32 preva = 0;
  1718. uae_u32 prevb = 0, srcb = b->bltbhold;
  1719. uae_u32 srcc = b->bltcdat;
  1720. uae_u32 dstd=0;
  1721. uae_u16 foo, *dstp = &foo;
  1722. for (j = 0; j < b->vblitsize; j++) {
  1723.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1724.  
  1725.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1726.         if (ptb) {
  1727.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1728.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1729.             prevb = bltbdat;
  1730.         }
  1731.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1732.         bltadat &= blit_masktable[i];
  1733.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1734.         preva = bltadat;
  1735.         do_put_mem_word (dstp, dstd);
  1736.         dstd = ((~(srcb | (~srca & srcc)) | (srcc & srca))) & 0xFFFF;
  1737.         totald |= dstd;
  1738.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1739.     }
  1740.     if (pta) pta += b->bltamod;
  1741.     if (ptb) ptb += b->bltbmod;
  1742.     if (ptc) ptc += b->bltcmod;
  1743.     if (ptd) ptd += b->bltdmod;
  1744. }
  1745. b->bltbhold = srcb;
  1746. b->bltcdat = srcc;
  1747.         do_put_mem_word (dstp, dstd);
  1748. }
  1749. if (totald == 0) b->blitzero = 1;
  1750. }
  1751. void blitdofast_desc_b1(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1752. {
  1753. uae_u32 totald = 0;
  1754. int i,j;
  1755. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1756. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1757. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1758. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1759. uae_u32 dest;
  1760. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1761. for (j=0;j<b->vblitsize;j++) {
  1762.     for(i=0;i<count;i++) {
  1763.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1764.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1765.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1766.         dest = (~(srcb | (~srca & srcc)) | (srcc & srca));
  1767.         totald |= dest;
  1768.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1769.     }
  1770.     if (oddword) {
  1771.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1772.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1773.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1774.         dest = (~(srcb | (~srca & srcc)) | (srcc & srca));
  1775.         totald |= dest;
  1776.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1777.     }
  1778.     if (pta) pta -= b->bltamod;
  1779.     if (ptb) ptb -= b->bltbmod;
  1780.     if (ptc) ptc -= b->bltcmod;
  1781.     if (ptd) ptd-=b->bltdmod;
  1782. }
  1783. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1784. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1785. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1786. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1787. } else {
  1788. uae_u32 preva = 0;
  1789. uae_u32 prevb = 0, srcb = b->bltbhold;
  1790. uae_u32 srcc = b->bltcdat;
  1791. uae_u32 dstd=0;
  1792. uae_u16 foo, *dstp = &foo;
  1793. for (j = 0; j < b->vblitsize; j++) {
  1794.     for (i = 0; i < b->hblitsize; i++) {
  1795.         uae_u32 bltadat, srca;
  1796.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1797.         if (ptb) {
  1798.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1799.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1800.             prevb = bltbdat;
  1801.         }
  1802.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1803.         bltadat &= blit_masktable[i];
  1804.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1805.         preva = bltadat;
  1806.         do_put_mem_word (dstp, dstd);
  1807.         dstd = ((~(srcb | (~srca & srcc)) | (srcc & srca))) & 0xFFFF;
  1808.         totald |= dstd;
  1809.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1810.     }
  1811.     if (pta) pta -= b->bltamod;
  1812.     if (ptb) ptb -= b->bltbmod;
  1813.     if (ptc) ptc -= b->bltcmod;
  1814.     if (ptd) ptd -= b->bltdmod;
  1815. }
  1816. b->bltbhold = srcb;
  1817. b->bltcdat = srcc;
  1818.         do_put_mem_word (dstp, dstd);
  1819. }
  1820. if (totald == 0) b->blitzero = 1;
  1821. }
  1822. void blitdofast_ca(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1823. {
  1824. int i,j;
  1825. uae_u32 totald = 0;
  1826. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1827. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  1828. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1829. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1830. uae_u32 dest;
  1831. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1832. for (j=0;j<b->vblitsize;j++) {
  1833.     for(i=0;i<count;i++) {
  1834.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  1835.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1836.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  1837.         dest = ((srcc & ~srca) | (srcb & srca));
  1838.         totald |= dest;
  1839.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1840.     }
  1841.     if (oddword) {
  1842.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  1843.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1844.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  1845.         dest = ((srcc & ~srca) | (srcb & srca));
  1846.         totald |= dest;
  1847.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1848.     }
  1849.     if (pta) pta += b->bltamod;
  1850.     if (ptb) ptb += b->bltbmod;
  1851.     if (ptc) ptc += b->bltcmod;
  1852.     if (ptd) ptd += b->bltdmod;
  1853. }
  1854. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  1855. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1856. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  1857. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1858. } else {
  1859. uae_u32 preva = 0;
  1860. uae_u32 prevb = 0, srcb = b->bltbhold;
  1861. uae_u32 srcc = b->bltcdat;
  1862. uae_u32 dstd=0;
  1863. uae_u16 foo, *dstp = &foo;
  1864. for (j = 0; j < b->vblitsize; j++) {
  1865.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1866.  
  1867.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  1868.         if (ptb) {
  1869.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1870.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  1871.             prevb = bltbdat;
  1872.         }
  1873.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  1874.         bltadat &= blit_masktable[i];
  1875.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  1876.         preva = bltadat;
  1877.         do_put_mem_word (dstp, dstd);
  1878.         dstd = (((srcc & ~srca) | (srcb & srca))) & 0xFFFF;
  1879.         totald |= dstd;
  1880.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  1881.     }
  1882.     if (pta) pta += b->bltamod;
  1883.     if (ptb) ptb += b->bltbmod;
  1884.     if (ptc) ptc += b->bltcmod;
  1885.     if (ptd) ptd += b->bltdmod;
  1886. }
  1887. b->bltbhold = srcb;
  1888. b->bltcdat = srcc;
  1889.         do_put_mem_word (dstp, dstd);
  1890. }
  1891. if (totald == 0) b->blitzero = 1;
  1892. }
  1893. void blitdofast_desc_ca(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1894. {
  1895. uae_u32 totald = 0;
  1896. int i,j;
  1897. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  1898. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  1899. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1900. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  1901. uae_u32 dest;
  1902. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1903. for (j=0;j<b->vblitsize;j++) {
  1904.     for(i=0;i<count;i++) {
  1905.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  1906.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  1907.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  1908.         dest = ((srcc & ~srca) | (srcb & srca));
  1909.         totald |= dest;
  1910.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  1911.     }
  1912.     if (oddword) {
  1913.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  1914.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  1915.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  1916.         dest = ((srcc & ~srca) | (srcb & srca));
  1917.         totald |= dest;
  1918.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  1919.     }
  1920.     if (pta) pta -= b->bltamod;
  1921.     if (ptb) ptb -= b->bltbmod;
  1922.     if (ptc) ptc -= b->bltcmod;
  1923.     if (ptd) ptd-=b->bltdmod;
  1924. }
  1925. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  1926. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  1927. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  1928. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  1929. } else {
  1930. uae_u32 preva = 0;
  1931. uae_u32 prevb = 0, srcb = b->bltbhold;
  1932. uae_u32 srcc = b->bltcdat;
  1933. uae_u32 dstd=0;
  1934. uae_u16 foo, *dstp = &foo;
  1935. for (j = 0; j < b->vblitsize; j++) {
  1936.     for (i = 0; i < b->hblitsize; i++) {
  1937.         uae_u32 bltadat, srca;
  1938.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  1939.         if (ptb) {
  1940.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  1941.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  1942.             prevb = bltbdat;
  1943.         }
  1944.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  1945.         bltadat &= blit_masktable[i];
  1946.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  1947.         preva = bltadat;
  1948.         do_put_mem_word (dstp, dstd);
  1949.         dstd = (((srcc & ~srca) | (srcb & srca))) & 0xFFFF;
  1950.         totald |= dstd;
  1951.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  1952.     }
  1953.     if (pta) pta -= b->bltamod;
  1954.     if (ptb) ptb -= b->bltbmod;
  1955.     if (ptc) ptc -= b->bltcmod;
  1956.     if (ptd) ptd -= b->bltdmod;
  1957. }
  1958. b->bltbhold = srcb;
  1959. b->bltcdat = srcc;
  1960.         do_put_mem_word (dstp, dstd);
  1961. }
  1962. if (totald == 0) b->blitzero = 1;
  1963. }
  1964. void blitdofast_cc(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  1965. {
  1966. int i,j;
  1967. uae_u32 totald = 0;
  1968. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitbshift) {
  1969. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  1970. uae_u32 dest;
  1971. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  1972. for (j=0;j<b->vblitsize;j++) {
  1973.     for(i=0;i<count;i++) {
  1974.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  1975.         dest = srcb;
  1976.         totald |= dest;
  1977.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  1978.     }
  1979.     if (oddword) {
  1980.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  1981.         dest = srcb;
  1982.         totald |= dest;
  1983.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  1984.     }
  1985.     if (ptb) ptb += b->bltbmod;
  1986.     if (ptd) ptd += b->bltdmod;
  1987. }
  1988. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  1989. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  1990. } else {
  1991. uae_u32 prevb = 0, srcb = b->bltbhold;
  1992. uae_u32 dstd=0;
  1993. uae_u16 foo, *dstp = &foo;
  1994. for (j = 0; j < b->vblitsize; j++) {
  1995.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  1996.  
  1997.         if (ptb) {
  1998.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  1999.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  2000.             prevb = bltbdat;
  2001.         }
  2002.         do_put_mem_word (dstp, dstd);
  2003.         dstd = (srcb) & 0xFFFF;
  2004.         totald |= dstd;
  2005.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2006.     }
  2007.     if (ptb) ptb += b->bltbmod;
  2008.     if (ptd) ptd += b->bltdmod;
  2009. }
  2010. b->bltbhold = srcb;
  2011.         do_put_mem_word (dstp, dstd);
  2012. }
  2013. if (totald == 0) b->blitzero = 1;
  2014. }
  2015. void blitdofast_desc_cc(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2016. {
  2017. uae_u32 totald = 0;
  2018. int i,j;
  2019. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitbshift) {
  2020. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2021. uae_u32 dest;
  2022. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2023. for (j=0;j<b->vblitsize;j++) {
  2024.     for(i=0;i<count;i++) {
  2025.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  2026.         dest = srcb;
  2027.         totald |= dest;
  2028.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2029.     }
  2030.     if (oddword) {
  2031.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  2032.         dest = srcb;
  2033.         totald |= dest;
  2034.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2035.     }
  2036.     if (ptb) ptb -= b->bltbmod;
  2037.     if (ptd) ptd-=b->bltdmod;
  2038. }
  2039. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  2040. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2041. } else {
  2042. uae_u32 prevb = 0, srcb = b->bltbhold;
  2043. uae_u32 dstd=0;
  2044. uae_u16 foo, *dstp = &foo;
  2045. for (j = 0; j < b->vblitsize; j++) {
  2046.     for (i = 0; i < b->hblitsize; i++) {
  2047.         uae_u32 bltadat, srca;
  2048.         if (ptb) {
  2049.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  2050.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  2051.             prevb = bltbdat;
  2052.         }
  2053.         do_put_mem_word (dstp, dstd);
  2054.         dstd = (srcb) & 0xFFFF;
  2055.         totald |= dstd;
  2056.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2057.     }
  2058.     if (ptb) ptb -= b->bltbmod;
  2059.     if (ptd) ptd -= b->bltdmod;
  2060. }
  2061. b->bltbhold = srcb;
  2062.         do_put_mem_word (dstp, dstd);
  2063. }
  2064. if (totald == 0) b->blitzero = 1;
  2065. }
  2066. void blitdofast_d8(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2067. {
  2068. int i,j;
  2069. uae_u32 totald = 0;
  2070. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2071. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2072. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2073. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2074. uae_u32 dest;
  2075. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2076. for (j=0;j<b->vblitsize;j++) {
  2077.     for(i=0;i<count;i++) {
  2078.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2079.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  2080.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  2081.         dest = ((srcc & srcb) | (~srcc & srca));
  2082.         totald |= dest;
  2083.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2084.     }
  2085.     if (oddword) {
  2086.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2087.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  2088.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  2089.         dest = ((srcc & srcb) | (~srcc & srca));
  2090.         totald |= dest;
  2091.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2092.     }
  2093.     if (pta) pta += b->bltamod;
  2094.     if (ptb) ptb += b->bltbmod;
  2095.     if (ptc) ptc += b->bltcmod;
  2096.     if (ptd) ptd += b->bltdmod;
  2097. }
  2098. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2099. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  2100. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  2101. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2102. } else {
  2103. uae_u32 preva = 0;
  2104. uae_u32 prevb = 0, srcb = b->bltbhold;
  2105. uae_u32 srcc = b->bltcdat;
  2106. uae_u32 dstd=0;
  2107. uae_u16 foo, *dstp = &foo;
  2108. for (j = 0; j < b->vblitsize; j++) {
  2109.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2110.  
  2111.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  2112.         if (ptb) {
  2113.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  2114.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  2115.             prevb = bltbdat;
  2116.         }
  2117.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2118.         bltadat &= blit_masktable[i];
  2119.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2120.         preva = bltadat;
  2121.         do_put_mem_word (dstp, dstd);
  2122.         dstd = (((srcc & srcb) | (~srcc & srca))) & 0xFFFF;
  2123.         totald |= dstd;
  2124.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2125.     }
  2126.     if (pta) pta += b->bltamod;
  2127.     if (ptb) ptb += b->bltbmod;
  2128.     if (ptc) ptc += b->bltcmod;
  2129.     if (ptd) ptd += b->bltdmod;
  2130. }
  2131. b->bltbhold = srcb;
  2132. b->bltcdat = srcc;
  2133.         do_put_mem_word (dstp, dstd);
  2134. }
  2135. if (totald == 0) b->blitzero = 1;
  2136. }
  2137. void blitdofast_desc_d8(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2138. {
  2139. uae_u32 totald = 0;
  2140. int i,j;
  2141. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2142. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2143. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2144. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2145. uae_u32 dest;
  2146. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2147. for (j=0;j<b->vblitsize;j++) {
  2148.     for(i=0;i<count;i++) {
  2149.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2150.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  2151.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  2152.         dest = ((srcc & srcb) | (~srcc & srca));
  2153.         totald |= dest;
  2154.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2155.     }
  2156.     if (oddword) {
  2157.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2158.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  2159.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  2160.         dest = ((srcc & srcb) | (~srcc & srca));
  2161.         totald |= dest;
  2162.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2163.     }
  2164.     if (pta) pta -= b->bltamod;
  2165.     if (ptb) ptb -= b->bltbmod;
  2166.     if (ptc) ptc -= b->bltcmod;
  2167.     if (ptd) ptd-=b->bltdmod;
  2168. }
  2169. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2170. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  2171. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  2172. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2173. } else {
  2174. uae_u32 preva = 0;
  2175. uae_u32 prevb = 0, srcb = b->bltbhold;
  2176. uae_u32 srcc = b->bltcdat;
  2177. uae_u32 dstd=0;
  2178. uae_u16 foo, *dstp = &foo;
  2179. for (j = 0; j < b->vblitsize; j++) {
  2180.     for (i = 0; i < b->hblitsize; i++) {
  2181.         uae_u32 bltadat, srca;
  2182.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  2183.         if (ptb) {
  2184.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  2185.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  2186.             prevb = bltbdat;
  2187.         }
  2188.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2189.         bltadat &= blit_masktable[i];
  2190.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2191.         preva = bltadat;
  2192.         do_put_mem_word (dstp, dstd);
  2193.         dstd = (((srcc & srcb) | (~srcc & srca))) & 0xFFFF;
  2194.         totald |= dstd;
  2195.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2196.     }
  2197.     if (pta) pta -= b->bltamod;
  2198.     if (ptb) ptb -= b->bltbmod;
  2199.     if (ptc) ptc -= b->bltcmod;
  2200.     if (ptd) ptd -= b->bltdmod;
  2201. }
  2202. b->bltbhold = srcb;
  2203. b->bltcdat = srcc;
  2204.         do_put_mem_word (dstp, dstd);
  2205. }
  2206. if (totald == 0) b->blitzero = 1;
  2207. }
  2208. void blitdofast_e2(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2209. {
  2210. int i,j;
  2211. uae_u32 totald = 0;
  2212. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2213. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2214. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2215. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2216. uae_u32 dest;
  2217. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2218. for (j=0;j<b->vblitsize;j++) {
  2219.     for(i=0;i<count;i++) {
  2220.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2221.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  2222.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  2223.         dest = ((srcc & ~srcb) | (srcb & srca));
  2224.         totald |= dest;
  2225.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2226.     }
  2227.     if (oddword) {
  2228.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2229.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  2230.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  2231.         dest = ((srcc & ~srcb) | (srcb & srca));
  2232.         totald |= dest;
  2233.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2234.     }
  2235.     if (pta) pta += b->bltamod;
  2236.     if (ptb) ptb += b->bltbmod;
  2237.     if (ptc) ptc += b->bltcmod;
  2238.     if (ptd) ptd += b->bltdmod;
  2239. }
  2240. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2241. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  2242. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  2243. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2244. } else {
  2245. uae_u32 preva = 0;
  2246. uae_u32 prevb = 0, srcb = b->bltbhold;
  2247. uae_u32 srcc = b->bltcdat;
  2248. uae_u32 dstd=0;
  2249. uae_u16 foo, *dstp = &foo;
  2250. for (j = 0; j < b->vblitsize; j++) {
  2251.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2252.  
  2253.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  2254.         if (ptb) {
  2255.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  2256.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  2257.             prevb = bltbdat;
  2258.         }
  2259.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2260.         bltadat &= blit_masktable[i];
  2261.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2262.         preva = bltadat;
  2263.         do_put_mem_word (dstp, dstd);
  2264.         dstd = (((srcc & ~srcb) | (srcb & srca))) & 0xFFFF;
  2265.         totald |= dstd;
  2266.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2267.     }
  2268.     if (pta) pta += b->bltamod;
  2269.     if (ptb) ptb += b->bltbmod;
  2270.     if (ptc) ptc += b->bltcmod;
  2271.     if (ptd) ptd += b->bltdmod;
  2272. }
  2273. b->bltbhold = srcb;
  2274. b->bltcdat = srcc;
  2275.         do_put_mem_word (dstp, dstd);
  2276. }
  2277. if (totald == 0) b->blitzero = 1;
  2278. }
  2279. void blitdofast_desc_e2(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2280. {
  2281. uae_u32 totald = 0;
  2282. int i,j;
  2283. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2284. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2285. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2286. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2287. uae_u32 dest;
  2288. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2289. for (j=0;j<b->vblitsize;j++) {
  2290.     for(i=0;i<count;i++) {
  2291.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2292.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  2293.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  2294.         dest = ((srcc & ~srcb) | (srcb & srca));
  2295.         totald |= dest;
  2296.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2297.     }
  2298.     if (oddword) {
  2299.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2300.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  2301.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  2302.         dest = ((srcc & ~srcb) | (srcb & srca));
  2303.         totald |= dest;
  2304.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2305.     }
  2306.     if (pta) pta -= b->bltamod;
  2307.     if (ptb) ptb -= b->bltbmod;
  2308.     if (ptc) ptc -= b->bltcmod;
  2309.     if (ptd) ptd-=b->bltdmod;
  2310. }
  2311. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2312. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  2313. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  2314. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2315. } else {
  2316. uae_u32 preva = 0;
  2317. uae_u32 prevb = 0, srcb = b->bltbhold;
  2318. uae_u32 srcc = b->bltcdat;
  2319. uae_u32 dstd=0;
  2320. uae_u16 foo, *dstp = &foo;
  2321. for (j = 0; j < b->vblitsize; j++) {
  2322.     for (i = 0; i < b->hblitsize; i++) {
  2323.         uae_u32 bltadat, srca;
  2324.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  2325.         if (ptb) {
  2326.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  2327.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  2328.             prevb = bltbdat;
  2329.         }
  2330.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2331.         bltadat &= blit_masktable[i];
  2332.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2333.         preva = bltadat;
  2334.         do_put_mem_word (dstp, dstd);
  2335.         dstd = (((srcc & ~srcb) | (srcb & srca))) & 0xFFFF;
  2336.         totald |= dstd;
  2337.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2338.     }
  2339.     if (pta) pta -= b->bltamod;
  2340.     if (ptb) ptb -= b->bltbmod;
  2341.     if (ptc) ptc -= b->bltcmod;
  2342.     if (ptd) ptd -= b->bltdmod;
  2343. }
  2344. b->bltbhold = srcb;
  2345. b->bltcdat = srcc;
  2346.         do_put_mem_word (dstp, dstd);
  2347. }
  2348. if (totald == 0) b->blitzero = 1;
  2349. }
  2350. void blitdofast_ea(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2351. {
  2352. int i,j;
  2353. uae_u32 totald = 0;
  2354. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2355. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2356. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2357. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2358. uae_u32 dest;
  2359. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2360. for (j=0;j<b->vblitsize;j++) {
  2361.     for(i=0;i<count;i++) {
  2362.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2363.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  2364.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  2365.         dest = (srcc | (srcb & srca));
  2366.         totald |= dest;
  2367.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2368.     }
  2369.     if (oddword) {
  2370.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2371.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  2372.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  2373.         dest = (srcc | (srcb & srca));
  2374.         totald |= dest;
  2375.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2376.     }
  2377.     if (pta) pta += b->bltamod;
  2378.     if (ptb) ptb += b->bltbmod;
  2379.     if (ptc) ptc += b->bltcmod;
  2380.     if (ptd) ptd += b->bltdmod;
  2381. }
  2382. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2383. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  2384. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  2385. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2386. } else {
  2387. uae_u32 preva = 0;
  2388. uae_u32 prevb = 0, srcb = b->bltbhold;
  2389. uae_u32 srcc = b->bltcdat;
  2390. uae_u32 dstd=0;
  2391. uae_u16 foo, *dstp = &foo;
  2392. for (j = 0; j < b->vblitsize; j++) {
  2393.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2394.  
  2395.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  2396.         if (ptb) {
  2397.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  2398.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  2399.             prevb = bltbdat;
  2400.         }
  2401.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2402.         bltadat &= blit_masktable[i];
  2403.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2404.         preva = bltadat;
  2405.         do_put_mem_word (dstp, dstd);
  2406.         dstd = ((srcc | (srcb & srca))) & 0xFFFF;
  2407.         totald |= dstd;
  2408.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2409.     }
  2410.     if (pta) pta += b->bltamod;
  2411.     if (ptb) ptb += b->bltbmod;
  2412.     if (ptc) ptc += b->bltcmod;
  2413.     if (ptd) ptd += b->bltdmod;
  2414. }
  2415. b->bltbhold = srcb;
  2416. b->bltcdat = srcc;
  2417.         do_put_mem_word (dstp, dstd);
  2418. }
  2419. if (totald == 0) b->blitzero = 1;
  2420. }
  2421. void blitdofast_desc_ea(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2422. {
  2423. uae_u32 totald = 0;
  2424. int i,j;
  2425. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2426. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2427. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2428. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2429. uae_u32 dest;
  2430. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2431. for (j=0;j<b->vblitsize;j++) {
  2432.     for(i=0;i<count;i++) {
  2433.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2434.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  2435.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  2436.         dest = (srcc | (srcb & srca));
  2437.         totald |= dest;
  2438.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2439.     }
  2440.     if (oddword) {
  2441.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2442.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  2443.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  2444.         dest = (srcc | (srcb & srca));
  2445.         totald |= dest;
  2446.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2447.     }
  2448.     if (pta) pta -= b->bltamod;
  2449.     if (ptb) ptb -= b->bltbmod;
  2450.     if (ptc) ptc -= b->bltcmod;
  2451.     if (ptd) ptd-=b->bltdmod;
  2452. }
  2453. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2454. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  2455. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  2456. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2457. } else {
  2458. uae_u32 preva = 0;
  2459. uae_u32 prevb = 0, srcb = b->bltbhold;
  2460. uae_u32 srcc = b->bltcdat;
  2461. uae_u32 dstd=0;
  2462. uae_u16 foo, *dstp = &foo;
  2463. for (j = 0; j < b->vblitsize; j++) {
  2464.     for (i = 0; i < b->hblitsize; i++) {
  2465.         uae_u32 bltadat, srca;
  2466.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  2467.         if (ptb) {
  2468.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  2469.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  2470.             prevb = bltbdat;
  2471.         }
  2472.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2473.         bltadat &= blit_masktable[i];
  2474.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2475.         preva = bltadat;
  2476.         do_put_mem_word (dstp, dstd);
  2477.         dstd = ((srcc | (srcb & srca))) & 0xFFFF;
  2478.         totald |= dstd;
  2479.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2480.     }
  2481.     if (pta) pta -= b->bltamod;
  2482.     if (ptb) ptb -= b->bltbmod;
  2483.     if (ptc) ptc -= b->bltcmod;
  2484.     if (ptd) ptd -= b->bltdmod;
  2485. }
  2486. b->bltbhold = srcb;
  2487. b->bltcdat = srcc;
  2488.         do_put_mem_word (dstp, dstd);
  2489. }
  2490. if (totald == 0) b->blitzero = 1;
  2491. }
  2492. void blitdofast_f0(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2493. {
  2494. int i,j;
  2495. uae_u32 totald = 0;
  2496. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  2497. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2498. uae_u32 dest;
  2499. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2500. for (j=0;j<b->vblitsize;j++) {
  2501.     for(i=0;i<count;i++) {
  2502.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2503.         dest = srca;
  2504.         totald |= dest;
  2505.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2506.     }
  2507.     if (oddword) {
  2508.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2509.         dest = srca;
  2510.         totald |= dest;
  2511.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2512.     }
  2513.     if (pta) pta += b->bltamod;
  2514.     if (ptd) ptd += b->bltdmod;
  2515. }
  2516. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2517. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2518. } else {
  2519. uae_u32 preva = 0;
  2520. uae_u32 dstd=0;
  2521. uae_u16 foo, *dstp = &foo;
  2522. for (j = 0; j < b->vblitsize; j++) {
  2523.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2524.  
  2525.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2526.         bltadat &= blit_masktable[i];
  2527.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2528.         preva = bltadat;
  2529.         do_put_mem_word (dstp, dstd);
  2530.         dstd = (srca) & 0xFFFF;
  2531.         totald |= dstd;
  2532.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2533.     }
  2534.     if (pta) pta += b->bltamod;
  2535.     if (ptd) ptd += b->bltdmod;
  2536. }
  2537.         do_put_mem_word (dstp, dstd);
  2538. }
  2539. if (totald == 0) b->blitzero = 1;
  2540. }
  2541. void blitdofast_desc_f0(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2542. {
  2543. uae_u32 totald = 0;
  2544. int i,j;
  2545. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  2546. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2547. uae_u32 dest;
  2548. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2549. for (j=0;j<b->vblitsize;j++) {
  2550.     for(i=0;i<count;i++) {
  2551.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2552.         dest = srca;
  2553.         totald |= dest;
  2554.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2555.     }
  2556.     if (oddword) {
  2557.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2558.         dest = srca;
  2559.         totald |= dest;
  2560.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2561.     }
  2562.     if (pta) pta -= b->bltamod;
  2563.     if (ptd) ptd-=b->bltdmod;
  2564. }
  2565. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2566. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2567. } else {
  2568. uae_u32 preva = 0;
  2569. uae_u32 dstd=0;
  2570. uae_u16 foo, *dstp = &foo;
  2571. for (j = 0; j < b->vblitsize; j++) {
  2572.     for (i = 0; i < b->hblitsize; i++) {
  2573.         uae_u32 bltadat, srca;
  2574.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2575.         bltadat &= blit_masktable[i];
  2576.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2577.         preva = bltadat;
  2578.         do_put_mem_word (dstp, dstd);
  2579.         dstd = (srca) & 0xFFFF;
  2580.         totald |= dstd;
  2581.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2582.     }
  2583.     if (pta) pta -= b->bltamod;
  2584.     if (ptd) ptd -= b->bltdmod;
  2585. }
  2586.         do_put_mem_word (dstp, dstd);
  2587. }
  2588. if (totald == 0) b->blitzero = 1;
  2589. }
  2590. void blitdofast_fa(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2591. {
  2592. int i,j;
  2593. uae_u32 totald = 0;
  2594. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  2595. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2596. uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2597. uae_u32 dest;
  2598. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2599. for (j=0;j<b->vblitsize;j++) {
  2600.     for(i=0;i<count;i++) {
  2601.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2602.         if (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}
  2603.         dest = (srcc | srca);
  2604.         totald |= dest;
  2605.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2606.     }
  2607.     if (oddword) {
  2608.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2609.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }
  2610.         dest = (srcc | srca);
  2611.         totald |= dest;
  2612.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2613.     }
  2614.     if (pta) pta += b->bltamod;
  2615.     if (ptc) ptc += b->bltcmod;
  2616.     if (ptd) ptd += b->bltdmod;
  2617. }
  2618. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2619. if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);
  2620. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2621. } else {
  2622. uae_u32 preva = 0;
  2623. uae_u32 srcc = b->bltcdat;
  2624. uae_u32 dstd=0;
  2625. uae_u16 foo, *dstp = &foo;
  2626. for (j = 0; j < b->vblitsize; j++) {
  2627.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2628.  
  2629.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }
  2630.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2631.         bltadat &= blit_masktable[i];
  2632.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2633.         preva = bltadat;
  2634.         do_put_mem_word (dstp, dstd);
  2635.         dstd = ((srcc | srca)) & 0xFFFF;
  2636.         totald |= dstd;
  2637.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2638.     }
  2639.     if (pta) pta += b->bltamod;
  2640.     if (ptc) ptc += b->bltcmod;
  2641.     if (ptd) ptd += b->bltdmod;
  2642. }
  2643. b->bltcdat = srcc;
  2644.         do_put_mem_word (dstp, dstd);
  2645. }
  2646. if (totald == 0) b->blitzero = 1;
  2647. }
  2648. void blitdofast_desc_fa(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2649. {
  2650. uae_u32 totald = 0;
  2651. int i,j;
  2652. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff) {
  2653. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2654. uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;
  2655. uae_u32 dest;
  2656. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2657. for (j=0;j<b->vblitsize;j++) {
  2658.     for(i=0;i<count;i++) {
  2659.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2660.         if (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}
  2661.         dest = (srcc | srca);
  2662.         totald |= dest;
  2663.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2664.     }
  2665.     if (oddword) {
  2666.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2667.         if (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }
  2668.         dest = (srcc | srca);
  2669.         totald |= dest;
  2670.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2671.     }
  2672.     if (pta) pta -= b->bltamod;
  2673.     if (ptc) ptc -= b->bltcmod;
  2674.     if (ptd) ptd-=b->bltdmod;
  2675. }
  2676. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2677. if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);
  2678. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2679. } else {
  2680. uae_u32 preva = 0;
  2681. uae_u32 srcc = b->bltcdat;
  2682. uae_u32 dstd=0;
  2683. uae_u16 foo, *dstp = &foo;
  2684. for (j = 0; j < b->vblitsize; j++) {
  2685.     for (i = 0; i < b->hblitsize; i++) {
  2686.         uae_u32 bltadat, srca;
  2687.         if (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }
  2688.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2689.         bltadat &= blit_masktable[i];
  2690.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2691.         preva = bltadat;
  2692.         do_put_mem_word (dstp, dstd);
  2693.         dstd = ((srcc | srca)) & 0xFFFF;
  2694.         totald |= dstd;
  2695.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2696.     }
  2697.     if (pta) pta -= b->bltamod;
  2698.     if (ptc) ptc -= b->bltcmod;
  2699.     if (ptd) ptd -= b->bltdmod;
  2700. }
  2701. b->bltcdat = srcc;
  2702.         do_put_mem_word (dstp, dstd);
  2703. }
  2704. if (totald == 0) b->blitzero = 1;
  2705. }
  2706. void blitdofast_fc(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2707. {
  2708. int i,j;
  2709. uae_u32 totald = 0;
  2710. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2711. uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;
  2712. uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2713. uae_u32 dest;
  2714. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2715. for (j=0;j<b->vblitsize;j++) {
  2716.     for(i=0;i<count;i++) {
  2717.         if (pta) {srca=*((uae_u32 *)pta); pta += 4;}
  2718.         if (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}
  2719.         dest = (srcb | srca);
  2720.         totald |= dest;
  2721.         if (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}
  2722.     }
  2723.     if (oddword) {
  2724.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }
  2725.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }
  2726.         dest = (srcb | srca);
  2727.         totald |= dest;
  2728.         if (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }
  2729.     }
  2730.     if (pta) pta += b->bltamod;
  2731.     if (ptb) ptb += b->bltbmod;
  2732.     if (ptd) ptd += b->bltdmod;
  2733. }
  2734. if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);
  2735. if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);
  2736. if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);
  2737. } else {
  2738. uae_u32 preva = 0;
  2739. uae_u32 prevb = 0, srcb = b->bltbhold;
  2740. uae_u32 dstd=0;
  2741. uae_u16 foo, *dstp = &foo;
  2742. for (j = 0; j < b->vblitsize; j++) {
  2743.     for (i = 0; i < b->hblitsize; i++) {        uae_u32 bltadat, srca;
  2744.  
  2745.         if (ptb) {
  2746.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;
  2747.             srcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;
  2748.             prevb = bltbdat;
  2749.         }
  2750.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } 
  2751.         bltadat &= blit_masktable[i];
  2752.         srca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;
  2753.         preva = bltadat;
  2754.         do_put_mem_word (dstp, dstd);
  2755.         dstd = ((srcb | srca)) & 0xFFFF;
  2756.         totald |= dstd;
  2757.         if (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }
  2758.     }
  2759.     if (pta) pta += b->bltamod;
  2760.     if (ptb) ptb += b->bltbmod;
  2761.     if (ptd) ptd += b->bltdmod;
  2762. }
  2763. b->bltbhold = srcb;
  2764.         do_put_mem_word (dstp, dstd);
  2765. }
  2766. if (totald == 0) b->blitzero = 1;
  2767. }
  2768. void blitdofast_desc_fc(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)
  2769. {
  2770. uae_u32 totald = 0;
  2771. int i,j;
  2772. if (currprefs.blits_32bit_enabled && b->hblitsize > 1 && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff && !b->blitbshift) {
  2773. uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;
  2774. uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;
  2775. uae_u32 dest;
  2776. int count=b->hblitsize/2, oddword=b->hblitsize&1;
  2777. for (j=0;j<b->vblitsize;j++) {
  2778.     for(i=0;i<count;i++) {
  2779.         if (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}
  2780.         if (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}
  2781.         dest = (srcb | srca);
  2782.         totald |= dest;
  2783.         if (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}
  2784.     }
  2785.     if (oddword) {
  2786.         if (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }
  2787.         if (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }
  2788.         dest = (srcb | srca);
  2789.         totald |= dest;
  2790.         if (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }
  2791.     }
  2792.     if (pta) pta -= b->bltamod;
  2793.     if (ptb) ptb -= b->bltbmod;
  2794.     if (ptd) ptd-=b->bltdmod;
  2795. }
  2796. if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);
  2797. if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);
  2798. if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);
  2799. } else {
  2800. uae_u32 preva = 0;
  2801. uae_u32 prevb = 0, srcb = b->bltbhold;
  2802. uae_u32 dstd=0;
  2803. uae_u16 foo, *dstp = &foo;
  2804. for (j = 0; j < b->vblitsize; j++) {
  2805.     for (i = 0; i < b->hblitsize; i++) {
  2806.         uae_u32 bltadat, srca;
  2807.         if (ptb) {
  2808.             uae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;
  2809.             srcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;
  2810.             prevb = bltbdat;
  2811.         }
  2812.         if (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } 
  2813.         bltadat &= blit_masktable[i];
  2814.         srca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;
  2815.         preva = bltadat;
  2816.         do_put_mem_word (dstp, dstd);
  2817.         dstd = ((srcb | srca)) & 0xFFFF;
  2818.         totald |= dstd;
  2819.         if (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }
  2820.     }
  2821.     if (pta) pta -= b->bltamod;
  2822.     if (ptb) ptb -= b->bltbmod;
  2823.     if (ptd) ptd -= b->bltdmod;
  2824. }
  2825. b->bltbhold = srcb;
  2826.         do_put_mem_word (dstp, dstd);
  2827. }
  2828. if (totald == 0) b->blitzero = 1;
  2829. }
  2830.